package com.zf.mapstruct.converter;

import com.zf.mapstruct.entity.UserInfo;
import com.zf.mapstruct.vo.UserInfoVO;
import org.mapstruct.*;

import java.util.List;

/**
 * MAPSTRUCT映射器，自动生成实现类，根据getter,setter方法设置属性。
 * 若指定(componentModel = MappingConstants.ComponentModel.SPRING)则会作为bean注入到spring容器中,
 * 默认情况下需要通过 Mappers.getMapper(Mapper.Class) 获取实例
 * 直接注入使用即可
 */
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface UserInfoConverter {

    /**
     * 在不指定 @Mapper(componentModel=)属性时，需要使用该方式获得映射器实例，如果配置了spring则直接注入映射器即可使用
     */
    // UserInfoConverter INSTANCE = Mappers.getMapper(UserInfoConverter.class);

    /**
     * 默认映射，属性名称相同的自动映射，如果类型不同则自动调用转换，若转换失败则抛出异常
     */
    UserInfoVO toDefaultUserInfoVO(UserInfo userInfo);

    /**
     * 其他不指定映射规则的属性，则自动按照名称映射
     */
    @Named("toCustomVo") // 指定方法名，给list映射时使用
    @Mapping(source = "username", target = "username")
    @Mapping(source = "realName", target = "realName")
    @Mapping(target = "email", ignore = true) //忽略 email 字段值
    UserInfoVO toCustomVo(UserInfo userInfo);


    /**
     * list参数转换，指定单个对象转换的方法即可
     */
    @IterableMapping(qualifiedByName = {"toCustomVo"})
    List<UserInfoVO> toCustomVoList(List<UserInfo> userInfoList);
}
